<?php

namespace Api;

use Closure;

class RouteRegistrar
{
    /**
     * @var Dingo\Api\Routing\Router
     */
    private $api;

    /**
     * @var string 路由组 url 前缀
     */
    private $prefix = [];

    /**
     * @var string 权限服务标识符
     */
    private $authProviderKey = [];

    /**
     * @var string 权限服务中间件（jwt）
     */
    private $authMiddleware = [];

    /**
     * 初始化
     */
    public function __construct()
    {
        $this->api = app('Dingo\Api\Routing\Router');
    }

    /**
     * 设置路由组
     * @param  string $groupName       路由组名称
     * @param  string $prefix          路由组 url 前缀
     * @param  string $authProviderKey 权限服务标识符
     * @return $this
     */
    public function group(string $groupName, string $prefix)
    {
        // 开放访问
        $this->prefix[$groupName]          = $prefix;
        $this->authProviderKey[$groupName] = null;
        $this->authMiddleware[$groupName]  = null;
        // 登录可用
        $this->prefix[$groupName.'Auth']          = $prefix;
        $this->authProviderKey[$groupName.'Auth'] = $groupName.'AuthProviderKey';
        $this->authMiddleware[$groupName.'Auth']  = 'api.auth';
        // 链式调用
        return $this;
    }

    /**
     * 获取路由组权限服务标识符
     * @param  string $groupName       路由组名称
     * @return string
     */
    public function getAuthProvidersKeyByGroup(string $groupName)
    {
        return $this->authProviderKey[$groupName.'Auth'];
    }
    
    /**
     * 魔术方法
     * 快速调用，注册路由组
     * @param  string $name      方法名
     * @param  array  $arguments 调用参数
     * @return void
     */
    public function __call($name, $arguments)
    {
        // 路由参数
        $version    = $arguments[0];
        $callback   = $arguments[1];
        $attributes = ['prefix' => $this->prefix[$name]];
        if ($this->authProviderKey[$name]) {
            $attributes['providers']  = $this->authProviderKey[$name];
            $attributes['middleware'] = $this->authMiddleware[$name];
        }
        // 注册路由
        $this->api->version($version, $attributes, $callback);
    }
}
